home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1995 November / Macworld Nov ’95.toast / Developers / Selection ƒ 2.5 / 2arrayGen < prev    next >
Encoding:
Text File  |  1994-11-06  |  1.7 KB  |  92 lines  |  [TEXT/MSET]

  1. (*
  2.  
  3. A 2arraygen is a dynamically-allocated 2-dimensional array, intended to be
  4. used for keeping text strings.  Each element has a maximum length that it
  5. will accept.  This class was created expressly for use in class editlist,
  6. but it may prove useful elsewhere.
  7.  
  8. Note that after instantiation we must first set the array size and the
  9. maximum number of characters per element with the init: message.  Then we
  10. must send new: because memory from the heap is allocated.
  11.  
  12. *)
  13.  
  14.  
  15. :class 2arrayGen super{ object }
  16.     var #ofRows
  17.     var #ofCols
  18.     var elemSize
  19.     var stride
  20.     handle arrayData
  21.  
  22. :m maxsize:  ( -- n )  \ maximum number of characters for a cell
  23.     get: elemSize 1- ;m
  24.  
  25. :m init:  ( #rows #cols maxSize -- )
  26.     1+ put: elemSize  \ must allow room for count byte
  27.     put: #ofCols 
  28.     put: #ofRows
  29.     get: #ofCols get: elemSize * put: stride
  30.     ;m
  31.  
  32.  
  33. :m release:
  34.     release: arrayData ;m
  35.  
  36. :m check:  ( row# col# -- )
  37.     get: #ofCols 1 -  > swap
  38.     get: #ofRows 1 -  > or abort" 2arrayGen indices out of bounds." ;m
  39.  
  40. :m elemAddr:  { row# col# -- addr }
  41.     row# col# check: self
  42.     ptr: arrayData
  43.     get: stride  row# * +
  44.     get: elemSize col# * +
  45.     ;m
  46.  
  47. :m to: { addr len row# col# \ dest -- }
  48.     len  maxSize: self  min -> len
  49.     row# col# elemAddr: self -> dest
  50.     addr ( src) dest 1+ len cmove
  51.     len dest c!
  52.     ;m
  53.  
  54. :m at: ( row# col# -- addr len )
  55.     elemAddr: self dup 1+ swap c@ ;m
  56.  
  57. :m clearall:
  58.     get: #ofRows 0 ?DO
  59.         get: #ofCols 0 ?DO
  60.             0 j i elemAddr: self c!
  61.                         LOOP
  62.                     LOOP ;m
  63.  
  64. :m new:
  65.     get: #ofCols get: #ofRows *
  66.     get: elemSize *
  67.     new: arrayData
  68.     clearall: self ;m
  69.  
  70. ;class
  71.  
  72. endload
  73.  
  74. *** EXAMPLE USE
  75.  
  76.  
  77. 2arrayGen gg
  78. 5 5 6 init: gg
  79. new: gg
  80.  
  81. " heelofgl" 0 0 to: gg
  82.  
  83. " barf" 0 1 to: gg
  84. " goot" 1 0 to: gg
  85.  
  86. 0 0 at: gg type
  87. 0 1 at: gg type
  88. 1 0 at: gg type
  89.  
  90. release: gg
  91.  
  92.